/**
 * @file main.c
 * @author lcz (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2022-11-15
 *
 * @copyright Copyright (c) 2022
 *
 */

#include "applib/lib_syscall.h"
#include "comm/types.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "my_shell/main.h"
#include <getopt.h>
#include <sys/file.h>
/**`
 * @brief 很奇怪 我的\n 放在最后无法背newlib库识别到 size大小错误
 * 我的建议是前后都包括一下\n
 * 转义字符的文字这块很奇怪，最好不要用，我都不知道哪里错了，没有源码级调试 newlib
 */




int main(int argc, char **argv)
{
    // 参数为1个
    // 只输入文件名 没有参数
    
    if (argc == 1)
    {
        // 等待输入 字符串 没有参数可选了 -n -h 无法使用
        char msg_buf[128];
        fgets(msg_buf, sizeof(msg_buf), stdin);
        msg_buf[sizeof(msg_buf) - 1] = '\0';
        puts(msg_buf);
        return 0;
    }
    // -n 打印次数，默认为1
    int count = 1;
    int ch;
    // newbib库有 标准库无 n: 表示 n后面必有参数
    // -h 使用方法
    while ((ch = getopt(argc, argv, "n:h")) != -1)
    {
        switch (ch)
        {
            // 打印help信息
        case 'h':
            puts("echo and message");
            puts("Usage: echo [-n count] message");
            optind = 1;
            return 0;
            // -n 参数处理
        case 'n':
            // atoi 标准C库函数
            count = atoi(optarg);
            break;
        case '?':
            // 错误处理
            if (optarg)
            {
                printf("** Unknown option:-%s **\n", optarg);
            }
            optind = 1;
            return -1;
        default:
            break;
        }
    }
    // 如果参数的索引大于 参数的个数-1 这存在问题，我们报错
    // optind 其实是newlib库的全局变量
    // getopt查找选项时，会从optidx指向的位置开始找，所以需要重新设置，另外，由于选项往往位于argv[1]及其以后，所以将该值设置成1
    if (optind > argc - 1)
    {
        fprintf(stderr, "Message is empty \n");
        optind = 1;
        return -1;
    }
    int kk=optind;
    char *msg = argv[optind];
    for (int i = 0; i < count; i++)
    {
        puts(msg);
    }
    optind = 1;
    return 0;
    // 也可以再最前面设置好吧
}
